#include "stm32f10x.h"
#include "delay.h"
#include "OLED.h"
#include "Motor.h"
#include "LED.h"
#include "USART.h"
#include <string.h>
#include <stdlib.h>

// 简化的状态定义
typedef enum
{
	STATE_NO_LINE, // 无红线
	STATE_HAS_LINE // 有红线
} LineState_TypeDef;

// 全局变量
LineState_TypeDef current_state = STATE_NO_LINE;
uint32_t last_command_time = 0;
uint32_t current_time = 0;
uint32_t display_timer = 0;

// 简化的命令解析结构
typedef struct
{
	char cmd[10];
	int value;
} Command_TypeDef;

// 函数声明
void parse_simple_command(char *data, Command_TypeDef *cmd);
void handle_red_detected(void);
void handle_no_red(void);
void update_display(void);

int main(void)
{
	// 初始化所有模块
	OLED_Init();
	Motor_Init();
	LED_Init();
	USART_Config();

	// 显示启动信息
	OLED_ShowString(1, 1, "Simple Red Car");
	OLED_ShowString(2, 1, "Red Line: NONE");
	OLED_ShowString(3, 1, "Motor: STOP");
	OLED_ShowString(4, 1, "Data: Waiting");

	// 绿色LED表示系统就绪
	LED_GreenOn();
	LED_RedOff();

	last_command_time = 0;
	current_time = 0;
	display_timer = 0;

	while (1)
	{
		current_time++;

		// 定期更新显示
		if (current_time - display_timer >= 50000)
		{
			display_timer = current_time;
			update_display();
		}

		// 检查是否收到OpenMV命令
		if (USART_RxCount > 0)
		{
			char received_data[50];
			Command_TypeDef cmd;

			// 复制接收到的数据
			memset(received_data, 0, sizeof(received_data));
			for (int i = 0; i < USART_RxCount && i < 49; i++)
			{
				received_data[i] = USART_RxBuffer[i];
			}

			// 解析命令
			parse_simple_command(received_data, &cmd);

			// 处理命令 - 只有两种情况：有红线和无红线
			if (strcmp(cmd.cmd, "RED") == 0 && cmd.value == 1)
			{
				handle_red_detected();
			}
			else
			{
				handle_no_red();
			}

			// 清空接收缓冲区
			USART_ClearRxBuffer();
			last_command_time = 0; // 重置超时计数
		}

		// 超时保护 - 如果长时间没收到命令则停车
		last_command_time++;
		if (last_command_time > 100000) // 约1秒超时
		{
			handle_no_red();		   // 超时当作无红线处理
			last_command_time = 50000; // 防止溢出
		}

		Delay_ms(1); // 添加小延时
	}
}

void parse_simple_command(char *data, Command_TypeDef *cmd)
{
	// 解析格式: "CMD,value\n"
	char *token;

	// 初始化
	memset(cmd->cmd, 0, sizeof(cmd->cmd));
	cmd->value = 0;

	// 获取命令类型
	token = strtok(data, ",");
	if (token != NULL)
	{
		strcpy(cmd->cmd, token);
	}

	// 获取数值
	token = strtok(NULL, ",\r\n");
	if (token != NULL)
	{
		cmd->value = atoi(token);
	}
}

void handle_red_detected(void)
{
	current_state = STATE_HAS_LINE;

	// 有红线，小车直行
	Motor_Forward();

	// 绿色LED表示正常运行
	LED_GreenOn();
	LED_RedOff();
}

void handle_no_red(void)
{
	current_state = STATE_NO_LINE;

	// 无红线，停车
	Motor_Stop();

	// 红色LED表示停止
	LED_RedOn();
	LED_GreenOff();
}

void update_display(void)
{
	// 第1行：标题
	OLED_ShowString(1, 1, "Simple Red Car");

	// 第2行：红线状态
	if (current_state == STATE_HAS_LINE)
	{
		OLED_ShowString(2, 1, "Red Line: YES  ");
	}
	else
	{
		OLED_ShowString(2, 1, "Red Line: NONE ");
	}

	// 第3行：电机状态
	if (current_state == STATE_HAS_LINE)
	{
		OLED_ShowString(3, 1, "Motor: FORWARD");
	}
	else
	{
		OLED_ShowString(3, 1, "Motor: STOP   ");
	}

	// 第4行：接收数据状态
	OLED_ShowString(4, 1, "Rx Count:");
	OLED_ShowNum(4, 10, USART_RxCount, 3);
}
